"""
工具5：JD生成工具
功能：智能生成职位描述
"""
import json
import logging
import os
from typing import Optional, Any
from langchain.tools import BaseTool
from pydantic import Field
from openai import OpenAI

logger = logging.getLogger(__name__)


class JDGenerationTool(BaseTool):
    """JD生成工具"""
    
    name: str = "jd_generation_tool"
    description: str = """
        智能生成职位描述（JD）。
        
        输入参数（JSON字符串）：
        {
            "title": "Python工程师",
            "salary": "20k-35k",
            "city": "杭州",
            "requirements": "3年+，熟悉Django"
        }
        
        返回：完整的职位描述
        """
    
    # 声明llm字段（Pydantic要求）
    llm: Optional[Any] = Field(default=None, exclude=True)
    
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        api_key = os.getenv("DASHSCOPE_API_KEY")
        if api_key:
            llm_client = OpenAI(
                api_key=api_key,
                base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
            )
        else:
            llm_client = None
        object.__setattr__(self, 'llm', llm_client)
    
    def _run(self, title: str, salary: str = "", city: str = "", requirements: str = "") -> str:
        try:
            if not self.llm:
                return self._error_response("LLM服务不可用")
            
            prompt = f"""生成职位描述：
职位：{title}
薪资：{salary}
城市：{city}
要求：{requirements}

请生成包含以下部分的JD：
1. 岗位职责（5-8条）
2. 任职要求（5-7条）
3. 福利待遇（3-5条）

格式要求：简洁专业，每条20-30字。"""
            
            response = self.llm.chat.completions.create(
                model="qwen-plus",
                messages=[{"role": "user", "content": prompt}],
                temperature=0.7
            )
            
            jd_content = response.choices[0].message.content
            
            return json.dumps({
                "success": True,
                "data": {"jd_content": jd_content},
                "message": "JD生成成功"
            }, ensure_ascii=False)
            
        except Exception as e:
            logger.error(f"JD生成失败: {str(e)}")
            return self._error_response(str(e))
    
    def _error_response(self, error: str) -> str:
        return json.dumps({
            "success": False,
            "error": error
        }, ensure_ascii=False)
    
    async def _arun(self, *args, **kwargs):
        raise NotImplementedError()


